#pragma once
#include <unordered_map>
struct DLinkedNode {
    int key, value;
    DLinkedNode *prev;
    DLinkedNode *next;
    DLinkedNode() : key(0), value(0), prev(nullptr), next(nullptr) {}
    DLinkedNode(int key, int value)
        : key(key), value(value), prev(nullptr), next(nullptr) {}
};
class LRUCache {
  private:
    std::unordered_map<int, DLinkedNode *> cache;
    DLinkedNode *head;
    DLinkedNode *tail;
    int size;
    int capacity;

  public:
    LRUCache(int capacity);
    int get(int key);
    void put(int key, int value);
    void addToHead(DLinkedNode *node);
    void removeNode(DLinkedNode *node);
    void moveToHead(DLinkedNode *node);
    DLinkedNode *removeTail();
    ~LRUCache();
};
